package cn.bonoon.kernel.annotations.services;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * 定义查询表
 * 
 * <pre>
 * Q：什么情况下需要必须添加此注解？什么情况下可以省略？
 * A：
 * 1.当查找的实体与接口的泛型实体相同，不需要添加此注解。
 * e.g.
 * <code>
 * @AutoImplements
 * public interface TestAbstractService extends GenericService<AccountEntity> {
 * 		@Select("x.name, x.id, x.creatorName")
 * 		@From(AccountEntity.class)    // @From(AccountEntity.class) 与 GenericService<AccountEntity> 是相同的实体，此行可省略
 * 		@Where("x.id=?")
 * 		Object[] getArray_Object(Long arg1);  
 * }
 * </code>
 * 
 * 2.当返回类型为一个实体，或实体的集体，且该实体为查找的数据库实体，则不需要添加此注解。
 * e.g.
 * <code>
 * @Where("x.id=?")
 * @From(PlaceEntity.class) // @From 指定查找的实体与函数返回的实体相同，此行可省略
 * PlaceEntity getObject(Long arg1);
 * 
 * @Where("x.id=?")
 * @From(PlaceEntity.class) // @From 指定查找的实体与函数返回集体的泛型相同，此行可省略
 * List<PlaceEntity> getList(Long arg1);
 * </code>
 * 
 * 3.当使用 {@link AutoTransform} 注解时，不需要添加此注解（添加无效）。
 * 
 * 4.除以上3种情况之外，其它情况都需要添加此注解。
 * </pre>
 * 
 * @author ocean~
 * 
 */
@Target(ElementType.METHOD)
@Retention(RUNTIME)
public @interface From {

	/**
	 * 查询表 (e.g. PlaceEntity.class)
	 */
	Class<?> value();

}
